﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MobiShop.Models;
using System.Collections;

namespace MobiShop.Controllers
{
    public class OrderController : Controller
    {
        private string GetErrorMessage(ShoppingBasketException ex)
        {
            string kq;
            switch (ex.ErrorID)
            {
                case 1: kq = "Mã mặt hàng không tồn tại trong cơ sở dữ liệu";
                    break;
                case 2: kq = "Mặt hàng " + ex.Message + " hiện không đủ số lượng cung ứng !";
                    break;
                case 3: kq = "Số lượng mặt hàng " + ex.Message +
                    " ko hợp lệ ! Yêu cầu: 0&lt;= số lượng &lt;= " + ShoppingBasket.maxOfEachProductQuantity.ToString();
                    break;
                case 4: kq = "Tổng số mặt hàng bạn đặt mua quá nhiều! Hiện tại chúng tôi chỉ đáp ứng các đơn bán hàng online có tổng số mặt hàng &lt;= " + ShoppingBasket.maxOfTotalProductsQuantity.ToString();
                    break;
                case 5: kq = "Mặt hàng " + ex.Message + " hiện chưa có giá, chúng tôi sẽ cập nhật giá sớm nhất có thể. Mong bạn thông cảm ...";
                    break;
                default: kq = "";
                    break;
            }
            return kq;
        }

        public ActionResult ManageBasket()
        {
            ShoppingBasket basket = (ShoppingBasket)Session["ShoppingBasket"];
            if (Request.QueryString["AddItem"] != null)//có yêu cầu add thêm sản phẩm mới
            {
                int id;
                if (int.TryParse(Request.QueryString["AddItem"], out id))
                {
                    try
                    {
                        basket.UpdateQuantity(id, 1, true);
                    }
                    catch (ShoppingBasketException ex)
                    {
                        ViewBag.ProductError_ID = id;
                        ViewBag.ErrorMessage = GetErrorMessage(ex);
                    }
                }
            }
            return View();
        }

        
        [HttpPost]
        public ActionResult ManageBasket(FormCollection form)
        {
            string errorMessage = "";
            ShoppingBasket basket = (ShoppingBasket)Session["ShoppingBasket"];

            // trường hợp yêu cầu xóa giỏ hàng
            if (form["btnClearBasket"] != null)
            {
                basket.Clear();
                return View();
            }

            // cập nhật lại giỏ hàng
            List<int> listProduct = basket.ListProduct_ID;
            foreach (int id in listProduct)
            {
                string removeName = "Remove_" + id;
                if (form[removeName] != null)
                {
                    basket.RemoveProduct(id);
                }
                else
                {
                    string quantityName = "Quantity_" + id;
                    if (form[quantityName] != null)
                    {
                        int quantity;
                        if (int.TryParse(form[quantityName], out quantity) && 0 <= quantity && quantity <= ShoppingBasket.maxOfEachProductQuantity)
                        {
                            try
                            {
                                basket.UpdateQuantity(id, quantity);
                            }
                            catch (ShoppingBasketException ex)
                            {
                                errorMessage += GetErrorMessage(ex) + "<br />";
                            }
                        }
                        else
                        {
                            Product product = ProductModels.GetProductById(id);
                            errorMessage += "Số lượng mặt hàng " + product.name +
                                " ko hợp lệ ! Yêu cầu: 0&lt;= số lượng &lt;= " + ShoppingBasket.maxOfEachProductQuantity.ToString() +
                                "<br />";
                        }
                    }
                    else basket.RemoveProduct(id);
                }
            }

            // trường hợp yêu cầu là thanh toán
            if (form["btnCheckOut"] != null && errorMessage == "")
            {
                if (basket.TotalQuantity > 0)
                {
                    if (Session["Account"] != null)
                        return RedirectToAction("CheckOut");
                    else return RedirectToAction("Login", "Home");
                }
                else errorMessage += "Không chấp nhận thanh toán cho đơn hàng rỗng !<br />";
            }

            if (errorMessage != "")
            {
                errorMessage = errorMessage.Remove(errorMessage.Length - 6);
                ViewBag.ErrorMessage = errorMessage;
            }
            return View();
        }

        public ActionResult CheckOut()
        {
            // kiểm tra người dùng đã đăng nhập ?
            if (Session["Account"] == null) RedirectToAction("Login", "Home");

            ShoppingBasket basket = (ShoppingBasket)Session["ShoppingBasket"];
            // ko chấp nhận thanh toán cho đơn hàng rỗng !
            if (basket.TotalQuantity == 0) return RedirectToAction("ManageBasket");
            basket.CalculatorSumPrice();
            ViewBag.isFirstRequest = true;

            return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult CheckOut(Order order, FormCollection form)
        {
            Account account = (Account)Session["Account"];
            if (account == null) RedirectToAction("Login", "Home");
            ShoppingBasket basket = (ShoppingBasket)Session["ShoppingBasket"];
            if (basket.TotalQuantity == 0) return RedirectToAction("ManageBasket");

            // lưu giữ trạng thái cho các nút radio
            ViewBag.rdoAddress = form["rdoAddress"];
            ViewBag.rdoCreditCard = form["rdoCreditCard"];

            if (ShoppingBasket.useCreditCard)
            {
                // trường hợp có sử dụng CreditCard => thực hiện phép kiểm tra đầy đủ
                if (!ModelState.IsValid)
                {
                    ViewBag.ErrorMessage = "Dữ liệu nhập không hợp lệ!";
                    return View();
                }
            }
            else
            {
                if (!ModelState.IsValidField("receiveName") ||
                    !ModelState.IsValidField("receiveAddress") ||
                    !ModelState.IsValidField("receivePhoneNumber") ||
                    !ModelState.IsValidField("receiveIdentityCardNumber"))
                {
                    ViewBag.ErrorMessage = "Dữ liệu nhập không hợp lệ!";
                    return View();
                }
            }
            // nếu người dùng chọn lấy thông tin thẻ tín dụng từ tài khoản, thì ta cần phải
            // đưa dữ liệu thẻ tín dụng thực sự vào đối tượng order

            if (form["rdoCreditCard"] == "1") // người dùng chọn lấy thông tin thẻ tín dụng đã có
            {
                order.creditCardNumber = account.creditCardNumber;
                order.cardCVV = account.cardCVV;
                order.cardMonthExpires = account.cardMonthExpires;
                order.cardYearExpires = account.cardYearExpires;
                order.cardType = account.cardType;
            }

            // ok, dữ liệu nhập ko có lỗi, tiến hành thanh toán và lưu đơn hàng vào CSDL
            string result = OrderModels.PayOrder(order, account, basket);
            if (result.Length == 0) // thành công
            {
                // xóa giỏ hàng, chuyển người dùng sang trang thông báo thành công
                basket.Clear();
                Session["Order"] = order;
                return RedirectToAction("OrderCompleted");
            }
            else
            {
                basket.CalculatorSumPrice();
                ViewBag.ErrorMessage = result + " Giao dịch thất bại !";
            }

            return View();
        }

        public ActionResult OrderCompleted()
        {
            if (Session["Account"] == null) return RedirectToAction("Index", "Home");
            Order order = (Order)Session["Order"];
            if (order == null) return RedirectToAction("Index", "Home");

            //Session["Order"] = null; // chỉ cho phép truy cập 1 lần ?

            ViewBag.order = order;
            return View();
        }
    }
}
